const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds
+function stateToString(state) {
+ return Object.keys(ExtensionState).find(k => ExtensionState[k] === state);
+}
+
export class ExtensionManager extends Signals.EventEmitter {
constructor() {
super();
delete extension.stylesheet;
}
+ _changeExtensionState(extension, newState) {
+ const strState = stateToString(newState);
+ console.debug(`Changing state of extension ${extension.uuid} to ${strState}`);
+
+ extension.state = newState;
+ this.emit('extension-state-changed', extension);
+ }
+
_extensionSupportsSessionMode(uuid) {
const extension = this.lookup(uuid);
if (extension.state !== ExtensionState.ENABLED)
return;
- extension.state = ExtensionState.DISABLING;
- this.emit('extension-state-changed', extension);
+ this._changeExtensionState(extension, ExtensionState.DISABLING);
// "Rebase" the extension order by disabling and then enabling extensions
// in order to help prevent conflicts.
for (let i = 0; i < orderReversed.length; i++) {
let otherUuid = orderReversed[i];
try {
+ console.debug(`Temporarily disable extension ${otherUuid}`);
this.lookup(otherUuid).stateObj.disable();
} catch (e) {
this.logExtensionError(otherUuid, e);
for (let i = 0; i < order.length; i++) {
let otherUuid = order[i];
try {
+ console.debug(`Re-enable extension ${otherUuid}`);
// eslint-disable-next-line no-await-in-loop
await this.lookup(otherUuid).stateObj.enable();
} catch (e) {
this._extensionOrder.splice(orderIdx, 1);
- if (extension.state !== ExtensionState.ERROR) {
- extension.state = ExtensionState.DISABLED;
- this.emit('extension-state-changed', extension);
- }
+ if (extension.state !== ExtensionState.ERROR)
+ this._changeExtensionState(extension, ExtensionState.DISABLED);
}
async _callExtensionEnable(uuid) {
if (extension.state !== ExtensionState.DISABLED)
return;
- extension.state = ExtensionState.ENABLING;
- this.emit('extension-state-changed', extension);
+ this._changeExtensionState(extension, ExtensionState.ENABLING);
try {
this._loadExtensionStylesheet(extension);
try {
await extension.stateObj.enable();
- extension.state = ExtensionState.ENABLED;
+ this._changeExtensionState(extension, ExtensionState.ENABLED);
this._extensionOrder.push(uuid);
- this.emit('extension-state-changed', extension);
} catch (e) {
this._unloadExtensionStylesheet(extension);
this.logExtensionError(uuid, e);
const message = error instanceof Error
? error.message : error.toString();
+ console.debug(`Changing state of extension ${uuid} to ERROR`);
extension.error = message;
extension.state = ExtensionState.ERROR;
if (!extension.errors)
}
async loadExtension(extension) {
+ const {uuid} = extension;
+ console.debug(`Loading extension ${uuid}`);
// Default to error, we set success as the last step
extension.state = ExtensionState.ERROR;
if (this._checkVersion && this._isOutOfDate(extension)) {
extension.state = ExtensionState.OUT_OF_DATE;
} else if (!this._canLoad(extension)) {
- this.logExtensionError(extension.uuid, new Error(
+ this.logExtensionError(uuid, new Error(
'A different version was loaded previously. You need to log out for changes to take effect.'));
} else {
- let enabled = this._enabledExtensions.includes(extension.uuid) &&
- this._extensionSupportsSessionMode(extension.uuid);
+ const enabled = this._enabledExtensions.includes(uuid) &&
+ this._extensionSupportsSessionMode(uuid);
if (enabled) {
- if (!await this._callExtensionInit(extension.uuid))
+ if (!await this._callExtensionInit(uuid))
return;
if (extension.state === ExtensionState.DISABLED)
- await this._callExtensionEnable(extension.uuid);
+ await this._callExtensionEnable(uuid);
} else {
extension.state = ExtensionState.INITIALIZED;
}
- this._unloadedExtensions.delete(extension.uuid);
+ this._unloadedExtensions.delete(uuid);
}
+ console.debug(`Extension ${uuid} in state ${stateToString(extension.state)} after loading`);
this._updateCanChange(extension);
this.emit('extension-state-changed', extension);
}
// broke too much.
await this._callExtensionDisable(uuid);
- extension.state = ExtensionState.UNINSTALLED;
- this.emit('extension-state-changed', extension);
+ this._changeExtensionState(extension, ExtensionState.UNINSTALLED);
// The extension is now cached and it's impossible to load a different version
if (type === ExtensionType.PER_USER && extension.isImported)
}
extension.stateObj = extensionState;
- extension.state = ExtensionState.DISABLED;
- this.emit('extension-loaded', uuid);
+ this._changeExtensionState(extension, ExtensionState.DISABLED);
return true;
}